#contextlib.contextmanager
import contextlib
import sys
@contextlib.contextmanager
def logging_context_manager():
    print('logging_context_manager: enter')
    try:
        yield "You're in a with-block!"
        print('logging_context_manager: normal exit')
    except Exception:
        print('logging_context_manager: exceptional exit',
              sys.exc_info())

with logging_context_manager() as x:
    print(x)

with logging_context_manager() as x:
    raise ValueError('Something went wrong!')


#contextmanager and exception propagation
@contextlib.contextmanager
def logging_context_manager():
    print('logging_context_manager: enter')
    try:
        yield "You're in a with-block!"
        print('logging_context_manager: normal exit')
    except Exception:
        print('logging_context_manager: exceptional exit',
               sys.exc_info())
        raise

with logging_context_manager() as x:
    raise ValueError('Something went wrong!')